/*
 * Created on 2007-11-18
 *
 * TODO
 */
package jacky.lanlan.song.aop.annotation;

import jacky.lanlan.song.aop.advice.*;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 概念类似于Spring的Advisor，定义AOP的{@link Pointcut}和拦截器。
 * <p>
 * 一个 Advisor 组合了一个{@link Pointcut}和一个 Advice 链，可以在 Advisor 里面定义针对给定{@link Pointcut}的各种 Advice 。
 * <p>
 * 和 Spring 类似，拦截器将以被声明的顺序依次调用。
 * <p>
 * 所有 Advice 的实例化模型(instantiation models)都是 Singleton，即 所有的 Advice 都是Singleton。
 * 
 * @author Jacky.Song
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Advisor {
	String pointcut();
	Class<? extends MethodBeforeAdvice> [] beforeAdvice() default{};
	Class<? extends AfterReturningAdvice> [] afterReturningAdvice() default{};
	Class<? extends ThrowsAdvice> [] throwsAdvice() default{};
	Class<? extends AfterAdvice> [] afterAdvice() default{};
	Class<? extends AroundAdvice> aroundAdvice() default AroundAdvice.class;
}
